package com.xtwy.common.core.service;


import org.apache.ibatis.session.RowBounds;
import org.springframework.data.repository.query.Param;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * @描述： 通用接口
 * @公司： 山西迅腾伟业
 * @版本： 1.0.0
 * @日期： 18/08/02
 * @作者： 侯建军
 */
public interface IService<T> {
    /**
     * 根据实体中的属性值进行查询, 查询条件使用等号
     * @param record the record
     * @return the list
     */
    List<T> select(T record);

    /**
     * 根据主键字段进行查询, 方法参数必须包含完整的主键属性,
     * 查询条件使用等号 @param key the key
     * @param key the key
     * @return the t
     */
    T selectByKey(Object key);

    /**
     * 查询全部结果, select(null)方法能达到同样的效果
     * @return the list
     */
    List<T> selectAll();

    /**
     * 根据实体中的属性进行查询, 只能有一个返回值, 有
     * 多个结果是抛出异常, 查询条件使用等号
     * @param record the record
     * @return the t
     */
    T selectOne(T record);

    /**
     * 根据实体中的属性查询总数, 查询条件使用等号
     * @param record the record
     * @return the int
     */
    int selectCount(T record);

    /**
     * @param @param  record
     * @param @return 参数
     * @return int 返回类型
     * @Title: save
     * @Description: 保存一个实体, null的属性不会保存, 会使用数据库默认值
     */
    int save(T record);

    /**
     * @param @param  list
     * @param @return 参数
     * @return int 返回类型
     * @Title: batchSave
     * @Description: 批量保存
     */
    @Transactional(rollbackFor = Exception.class)
    int batchSave(List<T> list);

    /**
     * @param @param  entity
     * @param @return 参数
     * @return int 返回类型
     * @Title: update
     * @Description: 根据主键更新属性不为null的值
     */
    int modify(T entity);

    /**
     * @param @param  record
     * @param @return 参数
     * @return int 返回类型
     * @Title: remove
     * @Description: 根据实体属性作为条件进行删除, 查询条件使用等号
     */
    int remove(T record);

    /**
     * @param @param  list
     * @param @return 参数
     * @return int 返回类型
     * @Title: batchRemove
     * @Description: 批量删除
     */
    @Transactional(rollbackFor = Exception.class)
    int batchRemove(List<T> list);

    /**
     * @param @param  key
     * @param @return 参数
     * @return int 返回类型
     * @Title: removeByKey
     * @Description: 根据主键字段进行删除, 方法参数必须包含完整的主键属性
     */
    int removeByKey(Object key);

    /**
     * @param @param  example
     * @param @return 参数
     * @return List<T> 返回类型
     * @Title: selectByExample
     * @Description: 这个查询支持通过Example类指定查询列,
     * 通过selectProperties方法指定查询列
     */
    List<T> selectByExample(Object example);

    /**
     * @param @param  example
     * @param @return 参数
     * @return int 返回类型
     * @throws @Company 山西特信环宇信息技术有限公司
     * @Title: selectCountByExample
     * @Description: 根据Example条件进行查询总数
     */
    int selectCountByExample(Object example);

    /**
     * 根据Example条件更新实体record包含的不是null的属性值 @param record the record
     *
     * @param record  the record
     * @param example the example
     * @return the int
     */
    int modfiyByExample(@Param("record") T record, @Param("example") Object example);

    /**
     * @param @param  example
     * @param @return 参数
     * @return int    返回类型
     * @throws
     * @Title: deleteByExample
     * @Description: 根据Example条件删除数据
     */
    int removeByExample(Object example);

    /**
     * @param @param  record
     * @param @param  rowBounds
     * @param @return 参数
     * @return List<T>    返回类型
     * @throws
     * @Title: selectByRowBounds
     * @Description: 根据实体属性和RowBounds进行分页查询
     */
    List<T> selectByRowBounds(T record, RowBounds rowBounds);

    /**
     * @param @param  example
     * @param @param  rowBounds
     * @param @return 参数
     * @return List<T>    返回类型
     * @throws
     * @Title: selectByExampleAndRowBounds
     * @Description: 根据example条件和RowBounds进行分页查询
     */
    List<T> selectByExampleAndRowBounds(Object example, RowBounds rowBounds);
}

